package sanbing.jcpplearning;

import cn.hutool.core.util.HexUtil;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import org.apache.commons.io.EndianUtils;

import java.nio.ByteBuffer;
import java.nio.ByteOrder;

/**
 * @author baigod
 */
public class ByteReadExample {
    public static void main(String[] args) {
        // 字节数组
        byte[] bytes = HexUtil.decodeHex("6822001900012023121200001001011047562E393572313300898604D11722D0348606024E87");

        // 方式1：EndianUtils
        /* 用于将字节数组中的数据以特定的 endianness 解释为 Java 中的基本数据类型。具有简单易用、支持多种 endianness 等优点，适合在简单的字节流解析场景下使用。 */
        long l = EndianUtils.readSwappedUnsignedInteger(bytes, 6);
        System.out.println(l);


        // 方式2：java.nio.ByteBuffer
        /* 是一个原生的 Java 类，用于对字节缓冲区进行操作。可以使用 ByteBuffer 类从字节数组中获取字节或将字节放入字节数组中。
            也可以使用 ByteBuffer 将字节数组中的数据解释为特定的 endianness。
            支持读写，相对定位和绝对定位。ByteBuffer 提供了更多的灵活性和功能，适用于需要更多控制和操作操作的高级字节流解析场景。
         */
        ByteBuffer byteBuffer = ByteBuffer.wrap(bytes);
        byteBuffer.order(ByteOrder.LITTLE_ENDIAN);
        int anInt = byteBuffer.getInt(6);
        System.out.println(anInt);

        // 方式3（推荐）：io.netty.buffer.ByteBuf
        /* 是Netty 框架中的一种缓冲区类型，与 ByteBuffer 相似，但提供了更优秀的性能和功能。ByteBuf 支持读写、相对访问和绝对访问，还可以查看和修改缓冲区的属性。
        与 ByteBuffer 不同，ByteBuf 可以自动扩展和收缩，因此在解析大小可变的字节流时非常有用。
        * */
        ByteBuf byteBuf = Unpooled.wrappedBuffer(bytes);
        long l1 = byteBuf.skipBytes(6)
                .readUnsignedIntLE();
        System.out.println(l1);
    }
}